package editor.graphics;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

import editor.graphics.EditorMapa.Estado;
import editor.modelo.EditorFloor;
import editor.modelo.LandMark;
import editor.modelo.Portal;
import editor.modelo.Space;
import editor.modelo.EditorSpace;

public class Painter2D implements Painter {


	private static final int TAMANIO_SPACE_SELECCIONADO = 10;

	private static final Color COLOR_SPACE_NUEVO = new Color(200, 200, 250, 160);

	private static final int TAMANIO_PUNTOS_SELECCINADO = 8;

	private static final Color COLOR_PUNTOS_SEL = new Color(150,255,150, 90);

	private static final Color COLOR_LAND_NUEVO =  new Color(150,255,150, 90);
	private static final int TAMANIO_LAND_SELECCIONADO = 20;
	

	public void dibujarMundo(Graphics2D g, EditorFloor piso, Seleccion seleccion,
			Estado estado, float xMouse, float yMouse) {

		for(Space sp: piso.getEspacios()){
			if(!seleccion.isSelected(sp))
				((EditorSpace)sp).dibujar(g);
			else{
				((EditorSpace)sp).dibujarSelccionado(g);
				for(Point2D pto: ((EditorSpace)sp).getBorde()){
					if(seleccion.isSelected(pto)){
						g.setColor(COLOR_PUNTOS_SEL);	
						g.fillRect((int)pto.getX() - (TAMANIO_PUNTOS_SELECCINADO>>1), 
								(int)pto.getY() - (TAMANIO_PUNTOS_SELECCINADO>>1),
								TAMANIO_PUNTOS_SELECCINADO , TAMANIO_PUNTOS_SELECCINADO);
						Point2D prox = ((EditorSpace)sp).getNextPoint(pto);
						if(prox != null){
							g.setStroke(new BasicStroke(3));
							g.drawLine((int)pto.getX(),(int)pto.getY(),
									(int)prox.getX(), (int)prox.getY());
							g.setStroke(new BasicStroke(1));
						}
					}
				}
			}
		}
		
		if(piso.getReferencia() != null){
			g.setColor(new Color(30,80,40));
			g.drawRect((int)piso.getReferencia().getCentro().getX() - TAMANIO_SPACE_SELECCIONADO, 
					(int)piso.getReferencia().getCentro().getY() - (TAMANIO_SPACE_SELECCIONADO),
					TAMANIO_PUNTOS_SELECCINADO<<2 , TAMANIO_PUNTOS_SELECCINADO<<2);
		}
		for(Portal d: piso.getPortales()){
		
			if(!seleccion.isSelected(d))
				((Dibujable) d).dibujar(g);
			else ((Dibujable) d).dibujarSelccionado(g);
		}
		
		for(LandMark lm: piso.getLandmarks()){
			if(!seleccion.isSelected(lm))
				((Dibujable) lm).dibujar(g);
			else ((Dibujable) lm).dibujarSelccionado(g);
			
		}

		if(estado == Estado.agregarEspacio){
			g.setColor(COLOR_SPACE_NUEVO);
			g.fillOval((int)xMouse -(TAMANIO_SPACE_SELECCIONADO>>1), 
					(int)yMouse - (TAMANIO_SPACE_SELECCIONADO>>1), 
					TAMANIO_SPACE_SELECCIONADO, TAMANIO_SPACE_SELECCIONADO);
		}
		if(estado == Estado.agregarLandMark){
			g.setColor(COLOR_LAND_NUEVO);

			g.drawOval((int)xMouse-(TAMANIO_LAND_SELECCIONADO),
					(int)yMouse-(TAMANIO_LAND_SELECCIONADO>>1),
					TAMANIO_LAND_SELECCIONADO*2, TAMANIO_LAND_SELECCIONADO);
		}
		if(estado == Estado.agregarPuntos){
			g.setColor(Color.GREEN);
			g.fillRect((int)xMouse-3, (int)yMouse-3, 6, 6);
			EditorSpace s = (EditorSpace) seleccion.getLastSelectedSpace();
			if(s!= null && s.getBorde().size()>=1){
				Point2D pto1 = seleccion.isPointSelected()?seleccion.getLastSelectedPoint(): 
					s.getBorde().get(s.getBorde().size()-1);
				Point2D pto2 = s.getNextPoint(pto1);

				if(pto1!= null){
					float[] dashPattern = { 10, 10, 10, 10 };
					g.setStroke(new BasicStroke(2, BasicStroke.CAP_BUTT,
							BasicStroke.JOIN_MITER, 2, dashPattern, 0));
					g.drawLine((int)pto1.getX(), (int)pto1.getY(),
							(int)xMouse, (int)yMouse);
					if(pto2 != null){
						g.drawLine((int)pto2.getX(),
								(int)pto2.getY(),
								(int)xMouse, (int)yMouse);
					}
					g.setStroke(new BasicStroke(1));
				}
			}
		}
	}
}
